package com.gator.desig_mode.proxy_cglib;

import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * @author 何章怀晓 hezhanghuaixiao
 * @version V1.0
 * @desc
 */
public class ProxyFacctory implements MethodInterceptor {

  private Object target;

  public ProxyFacctory(Object target) {
    this.target = target;
  }

  public Object getProxyInstance() {
    //创建工具类
    Enhancer enhancer = new Enhancer();

    //设置父类
    enhancer.setSuperclass(target.getClass());

    //设置回调函数
    enhancer.setCallback(this);

    //创建子类对象，即代理对象
    return enhancer.create();
  }


  /**
   * @param o 目标代理对象
   * @param method 被代理对象被执行的方法
   * @return java.lang.Object
   * @describe
   * @author 何章怀晓 hezhanghuaixiao
   * @date 2022/3/13  15:09
   * @other 执行代理对象即触发此拦截器，该方法也是被回调的方法-- enhancer.setCallback(this);
   */
  @Override
  public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy)
      throws Throwable {

    System.out.println("CGLIB代理开始....");

    //Object invoke = method.invoke(target, args);

    Object invoke = methodProxy.invoke(target, args);
    //Object invoke = methodProxy.invokeSuper(o, args);  //字节码中对应的方法

    System.out.println("CGLIB代理提交....");

    return invoke;
  }
}
